package core

import (
	"github.com/hajimehoshi/ebiten/v2"
	"github.com/solarlune/resolv"
)

// Frame 表示动画的一帧，包含图像和绘制选项
type Frame struct {
	Image *ebiten.Image
	// 可以添加更多绘制选项，如位置、缩放等
}

type AnimationOption struct {
	Frames    []*Frame
	Delay     int  // 每帧之间的延迟（以帧数为单位）
	IsLooping bool // 动画播放的次数，0 表示无限循环
}

// Animation 表示一个动画序列
type Animation struct {
	Frames    []*Frame
	Index     int
	Delay     int
	count     int // 用于记录当前帧已经显示的次数
	isLooping bool
	playCount int
}

func NewAnimation(opt *AnimationOption) *Animation {
	return &Animation{
		Frames:    opt.Frames,
		Delay:     opt.Delay,
		isLooping: opt.IsLooping,
	}
}

// Update 更新动画帧
func (a *Animation) Update(dt float64) {
	if a.End() {
		return
	}

	a.count++
	if a.count >= a.Delay {
		a.Index = (a.Index + 1) % len(a.Frames)
		a.count = 0
	}

	if !a.isLooping && a.Index == len(a.Frames)-1 {
		a.playCount++
	}
}

// Draw 绘制当前动画帧
func (a *Animation) Draw(screen *ebiten.Image, scale *resolv.Vector, position *resolv.Vector) {
	if a.End() {
		return
	}

	if len(a.Frames) == 0 {
		return
	}
	op := &ebiten.DrawImageOptions{}
	op.GeoM.Scale(scale.X, scale.Y)
	op.GeoM.Translate(position.X, position.Y)

	// 可以在这里设置绘制选项，如位置、缩放等
	screen.DrawImage(a.Frames[a.Index].Image, op)
}

func (a *Animation) End() bool {
	if !a.isLooping && a.playCount > 0 {
		return true
	}
	return false
}
